ํ์ด์ฌ ์ดํฐ๋ ์ด์ ์ ํ์ ๊นจ์ฐ์ธ์. `__iter__`์ `__next__` ๋ฉ์๋๋ฅผ ํ์ฉํ ์ปค์คํ ์ดํฐ๋ ์ดํฐ ๊ตฌํ ๊ฐ์ด๋๋ก, ์ค์ ์์์ ํจ๊ป ์ ์ธ๊ณ ๊ฐ๋ฐ์๋ค์ ์ํด ์ค๋น๋์์ต๋๋ค.
ํ์ด์ฌ ์ดํฐ๋ ์ดํฐ ํ๋กํ ์ฝ ํํค์น๊ธฐ: __iter__์ __next__ ์ฌ์ธต ํ๊ตฌ
๋ฐ๋ณต(Iteration)์ ํ๋ก๊ทธ๋๋ฐ์์ ๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ ๊ฐ๋ ์ค ํ๋์ ๋๋ค. ํ์ด์ฌ์์๋ ๋จ์ํ for ๋ฃจํ๋ถํฐ ๋ณต์กํ ๋ฐ์ดํฐ ์ฒ๋ฆฌ ํ์ดํ๋ผ์ธ์ ์ด๋ฅด๊ธฐ๊น์ง ๋ชจ๋ ๊ฒ์ ๊ตฌ๋ํ๋ ์ฐ์ํ๊ณ ํจ์จ์ ์ธ ๋ฉ์ปค๋์ฆ์ ๋๋ค. ์ฌ๋ฌ๋ถ์ ๋ฆฌ์คํธ๋ฅผ ๋ฐ๋ณตํ๊ฑฐ๋, ํ์ผ์์ ์ค์ ์ฝ๊ฑฐ๋, ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ฒฐ๊ณผ๋ก ์์ ํ ๋ ๋งค์ผ ์ด๋ฅผ ์ฌ์ฉํฉ๋๋ค. ํ์ง๋ง ๊ทธ ์ด๋ฉด์ ์ด๋ค ์ผ์ด ๋ฒ์ด์ง๊ณ ์๋์ง ๊ถ๊ธํด ๋ณธ ์ ์ด ์์ผ์ ๊ฐ์? ํ์ด์ฌ์ ์ด๋ป๊ฒ ๊ทธ๋ ๊ฒ ๋ง์ ์ข ๋ฅ์ ๊ฐ์ฒด์์ '๋ค์' ํญ๋ชฉ์ ๊ฐ์ ธ์ค๋ ๋ฐฉ๋ฒ์ ์๋ ๊ฑธ๊น์?
๊ทธ ํด๋ต์ ์ดํฐ๋ ์ดํฐ ํ๋กํ ์ฝ์ด๋ผ๊ณ ์๋ ค์ง ๊ฐ๋ ฅํ๊ณ ์ฐ์ํ ๋์์ธ ํจํด์ ์์ต๋๋ค. ์ด ํ๋กํ ์ฝ์ ํ์ด์ฌ์ ๋ชจ๋ ์ํ์ค ์ ์ฌ ๊ฐ์ฒด๋ค์ด ์ฌ์ฉํ๋ ๊ณตํต ์ธ์ด์ ๋๋ค. ์ด ํ๋กํ ์ฝ์ ์ดํดํ๊ณ ๊ตฌํํจ์ผ๋ก์จ, ํ์ด์ฌ์ ๋ฐ๋ณต ๋๊ตฌ์ ์๋ฒฝํ๊ฒ ํธํ๋๋ ์์ ๋ง์ ์ฌ์ฉ์ ์ ์ ๊ฐ์ฒด๋ฅผ ๋ง๋ค ์ ์์ผ๋ฉฐ, ์ด๋ ์ฌ๋ฌ๋ถ์ ์ฝ๋๋ฅผ ๋์ฑ ํํ๋ ฅ ์๊ณ , ๋ฉ๋ชจ๋ฆฌ ํจ์จ์ ์ด๋ฉฐ, ์ ํ์ ์ผ๋ก 'ํ์ด์ฌ์ค๋ฌ์ด' ์ฝ๋๋ก ๋ง๋ค์ด ์ค ๊ฒ์ ๋๋ค.
์ด ํฌ๊ด์ ์ธ ๊ฐ์ด๋๋ ์ดํฐ๋ ์ดํฐ ํ๋กํ ์ฝ์ ์ฌ์ธต์ ์ผ๋ก ํ๊ตฌํ ๊ฒ์ ๋๋ค. ์ฐ๋ฆฌ๋ `__iter__`์ `__next__` ๋ฉ์๋ ๋ค์ ์จ๊ฒจ์ง ๋ง๋ฒ์ ํ๊ณ , ์ดํฐ๋ฌ๋ธ(iterable)๊ณผ ์ดํฐ๋ ์ดํฐ(iterator)์ ์ค์ํ ์ฐจ์ด์ ์ ๋ช ํํ ํ๋ฉฐ, ์ฒ์๋ถํฐ ์์ ๋ง์ ์ปค์คํ ์ดํฐ๋ ์ดํฐ๋ฅผ ๊ตฌ์ถํ๋ ๊ณผ์ ์ ์๋ดํ ๊ฒ์ ๋๋ค. ํ์ด์ฌ ๋ด๋ถ ๊ตฌ์กฐ์ ๋ํ ์ดํด๋ฅผ ์ฌํํ๋ ค๋ ์ค๊ธ ๊ฐ๋ฐ์์ด๋ , ๋์ฑ ์ ๊ตํ API๋ฅผ ์ค๊ณํ๋ ค๋ ์ ๋ฌธ๊ฐ์ด๋ , ์ดํฐ๋ ์ดํฐ ํ๋กํ ์ฝ์ ๋ง์คํฐํ๋ ๊ฒ์ ์ฌ๋ฌ๋ถ์ ์ฌ์ ์์ ์ค์ํ ๋จ๊ณ์ ๋๋ค.
'์': ๋ฐ๋ณต์ ์ค์์ฑ๊ณผ ํ
๊ธฐ์ ์ ์ธ ๊ตฌํ์ ๋ฐ์ด๋ค๊ธฐ ์ ์, ์ดํฐ๋ ์ดํฐ ํ๋กํ ์ฝ์ด ์ ๊ทธ๋ ๊ฒ ์ค์ํ์ง ์ดํดํ๋ ๊ฒ์ด ํ์์ ์ ๋๋ค. ๊ทธ ์ด์ ์ ๋จ์ํ `for` ๋ฃจํ๋ฅผ ๊ฐ๋ฅํ๊ฒ ํ๋ ๊ฒ์ ํจ์ฌ ๋ฐ์ด๋์ต๋๋ค.
๋ฉ๋ชจ๋ฆฌ ํจ์จ์ฑ ๋ฐ ์ง์ฐ ํ๊ฐ
๋ช ๊ธฐ๊ฐ๋ฐ์ดํธ ํฌ๊ธฐ์ ๋ฐฉ๋ํ ๋ก๊ทธ ํ์ผ์ ์ฒ๋ฆฌํด์ผ ํ๋ค๊ณ ์์ํด ๋ณด์ธ์. ์ ์ฒด ํ์ผ์ ๋ฉ๋ชจ๋ฆฌ์ ๋ฆฌ์คํธ๋ก ์ฝ์ด ๋ค์ธ๋ค๋ฉด ์์คํ ๋ฆฌ์์ค๊ฐ ๊ณ ๊ฐ๋ ๊ฐ๋ฅ์ฑ์ด ๋์ต๋๋ค. ์ดํฐ๋ ์ดํฐ๋ ์ง์ฐ ํ๊ฐ(lazy evaluation)๋ผ๋ ๊ฐ๋ ์ ํตํด ์ด ๋ฌธ์ ๋ฅผ ์๋ฆ๋ต๊ฒ ํด๊ฒฐํฉ๋๋ค.
์ดํฐ๋ ์ดํฐ๋ ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ํ ๋ฒ์ ๋ก๋ํ์ง ์์ต๋๋ค. ๋์ , ์์ฒญ๋ ๋๋ง ํ ๋ฒ์ ํ๋์ ํญ๋ชฉ์ ์์ฑํ๊ฑฐ๋ ๊ฐ์ ธ์ต๋๋ค. ์ํ์ค์์ ์์ ์ด ์ด๋์ ์๋์ง ๊ธฐ์ตํ๊ธฐ ์ํด ๋ด๋ถ ์ํ๋ฅผ ์ ์งํฉ๋๋ค. ์ด๋ ์ด๋ก ์ ์ผ๋ก ๋งค์ฐ ์๊ณ ์ผ์ ํ ์์ ๋ฉ๋ชจ๋ฆฌ๋ก ๋ฌดํํ ํฐ ๋ฐ์ดํฐ ์คํธ๋ฆผ์ ์ฒ๋ฆฌํ ์ ์์์ ์๋ฏธํฉ๋๋ค. ์ด๊ฒ์ด ๋ฐ๋ก ํ๋ก๊ทธ๋จ ์ถฉ๋ ์์ด ๋ฐฉ๋ํ ํ์ผ์ ํ ์ค์ฉ ์ฝ์ ์ ์๋๋ก ํ๋ ๋์ผํ ์๋ฆฌ์ ๋๋ค.
๊น๋ํ๊ณ ์ฝ๊ธฐ ์ฌ์ฐ๋ฉฐ ๋ณดํธ์ ์ธ ์ฝ๋
์ดํฐ๋ ์ดํฐ ํ๋กํ ์ฝ์ ์์ฐจ์ ์ ๊ทผ์ ์ํ ๋ณดํธ์ ์ธ ์ธํฐํ์ด์ค๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฆฌ์คํธ, ํํ, ๋์ ๋๋ฆฌ, ๋ฌธ์์ด, ํ์ผ ๊ฐ์ฒด ๋ฐ ๊ธฐํ ๋ง์ ์ ํ์ด ๋ชจ๋ ์ด ํ๋กํ ์ฝ์ ๋ฐ๋ฅด๊ธฐ ๋๋ฌธ์, ๋์ผํ ๊ตฌ๋ฌธ์ธ `for` ๋ฃจํ๋ฅผ ์ฌ์ฉํ์ฌ ๋ชจ๋ ๊ฒ์ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค. ์ด๋ฌํ ํต์ผ์ฑ์ ํ์ด์ฌ์ ๊ฐ๋ ์ฑ์ ์ด์์ ๋๋ค.
๋ค์ ์ฝ๋๋ฅผ ์ดํด๋ณด์ธ์:
์ฝ๋:
my_list = [1, 2, 3]
for item in my_list:
print(item)
my_string = "abc"
for char in my_string:
print(char)
with open('my_file.txt', 'r') as f:
for line in f:
print(line)
`for` ๋ฃจํ๋ ์ ์ ๋ฆฌ์คํธ๋ฅผ ๋ฐ๋ณตํ๋์ง, ๋ฌธ์์ด์ ๋ฐ๋ณตํ๋์ง, ํ์ผ์์ ์ค์ ๋ฐ๋ณตํ๋์ง ์ ๊ฒฝ ์ฐ์ง ์์ต๋๋ค. ๋จ์ํ ๊ฐ์ฒด์๊ฒ ์ดํฐ๋ ์ดํฐ๋ฅผ ์์ฒญํ๊ณ , ์ดํฐ๋ ์ดํฐ์๊ฒ ๋ค์ ํญ๋ชฉ์ ๋ฐ๋ณต์ ์ผ๋ก ์์ฒญํ ๋ฟ์ ๋๋ค. ์ด ์ถ์ํ๋ ์์ฒญ๋๊ฒ ๊ฐ๋ ฅํฉ๋๋ค.
์ดํฐ๋ ์ดํฐ ํ๋กํ ์ฝ ํด์ฒดํ๊ธฐ
ํ๋กํ ์ฝ ์์ฒด๋ ๋๋๊ฒ๋ ๊ฐ๋จํ๋ฉฐ, ์ผ๋ฐ์ ์ผ๋ก "๋๋(dunder)"(์ด์ค ๋ฐ์ค) ๋ฉ์๋๋ผ๊ณ ๋ถ๋ฆฌ๋ ๋ ๊ฐ์ง ํน์ ๋ฉ์๋๋ก ์ ์๋ฉ๋๋ค:
- `__iter__()`
- `__next__()`
์ด๊ฒ๋ค์ ์์ ํ ์ดํดํ๋ ค๋ฉด ๋จผ์ ๋ ๊ฐ์ง ๊ด๋ จ ์์ง๋ง ๋ค๋ฅธ ๊ฐ๋ ์ธ ์ดํฐ๋ฌ๋ธ(iterable)๊ณผ ์ดํฐ๋ ์ดํฐ(iterator)์ ๊ตฌ๋ถ์ ์ดํดํด์ผ ํฉ๋๋ค.
์ดํฐ๋ฌ๋ธ vs. ์ดํฐ๋ ์ดํฐ: ์ค์ํ ๊ตฌ๋ถ
์ด๊ฒ์ ์ข ์ข ์ด๋ณด์๋ค์๊ฒ ํผ๋์ค๋ฌ์ด ์ง์ ์ด์ง๋ง, ๊ทธ ์ฐจ์ด๋ ๋งค์ฐ ์ค์ํฉ๋๋ค.
์ดํฐ๋ฌ๋ธ์ด๋?
์ดํฐ๋ฌ๋ธ์ ๋ฐ๋ณต๋ ์ ์๋ ๋ชจ๋ ๊ฐ์ฒด์ ๋๋ค. ๋ด์ฅ ํจ์ `iter()`์ ์ ๋ฌํ์ฌ ์ดํฐ๋ ์ดํฐ๋ฅผ ์ป์ ์ ์๋ ๊ฐ์ฒด์ ๋๋ค. ๊ธฐ์ ์ ์ผ๋ก, ๊ฐ์ฒด๋ `__iter__` ๋ฉ์๋๋ฅผ ๊ตฌํํ๋ฉด ์ดํฐ๋ฌ๋ธ๋ก ๊ฐ์ฃผ๋ฉ๋๋ค. `__iter__` ๋ฉ์๋์ ์ ์ผํ ๋ชฉ์ ์ ์ดํฐ๋ ์ดํฐ ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ ๊ฒ์ ๋๋ค.
๋ด์ฅ ์ดํฐ๋ฌ๋ธ์ ์์๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- ๋ฆฌ์คํธ (`[1, 2, 3]`)
- ํํ (`(1, 2, 3)`)
- ๋ฌธ์์ด (`"hello"`)
- ๋์ ๋๋ฆฌ (`{'a': 1, 'b': 2}` - ํค๋ฅผ ๋ฐ๋ณต)
- ์ (`{1, 2, 3}`)
- ํ์ผ ๊ฐ์ฒด
์ดํฐ๋ฌ๋ธ์ ๋ฐ์ดํฐ์ ์ปจํ ์ด๋ ๋๋ ์์ค๋ก ์๊ฐํ ์ ์์ต๋๋ค. ์ดํฐ๋ฌ๋ธ ์์ฒด๋ ํญ๋ชฉ์ ์์ฑํ๋ ๋ฐฉ๋ฒ์ ๋ชจ๋ฅด์ง๋ง, ํญ๋ชฉ์ ์์ฑํ ์ ์๋ ๊ฐ์ฒด, ์ฆ ์ดํฐ๋ ์ดํฐ๋ฅผ ์์ฑํ๋ ๋ฐฉ๋ฒ์ ์๊ณ ์์ต๋๋ค.
์ดํฐ๋ ์ดํฐ๋?
์ดํฐ๋ ์ดํฐ๋ ๋ฐ๋ณต ์ค์ ์ค์ ๋ก ๊ฐ์ ์์ฑํ๋ ์์ ์ ์ํํ๋ ๊ฐ์ฒด์ ๋๋ค. ๋ฐ์ดํฐ ์คํธ๋ฆผ์ ๋ํ๋ ๋๋ค. ์ดํฐ๋ ์ดํฐ๋ ๋ ๊ฐ์ง ๋ฉ์๋๋ฅผ ๊ตฌํํด์ผ ํฉ๋๋ค:
- `__iter__()`: ์ด ๋ฉ์๋๋ ์ดํฐ๋ ์ดํฐ ๊ฐ์ฒด ์์ฒด(`self`)๋ฅผ ๋ฐํํด์ผ ํฉ๋๋ค. ์ด๋ ์ดํฐ๋ ์ดํฐ๊ฐ `for` ๋ฃจํ์ ๊ฐ์ด ์ดํฐ๋ฌ๋ธ์ด ์์๋๋ ๊ณณ์์ ์ฌ์ฉ๋ ์ ์๋๋ก ํ๋ ๋ฐ ํ์ํฉ๋๋ค.
- `__next__()`: ์ด ๋ฉ์๋๋ ์ดํฐ๋ ์ดํฐ์ ์์ง์ ๋๋ค. ์ํ์ค์ ๋ค์ ํญ๋ชฉ์ ๋ฐํํฉ๋๋ค. ๋ ์ด์ ๋ฐํํ ํญ๋ชฉ์ด ์์ ๋๋ ๋ฐ๋์ `StopIteration` ์์ธ๋ฅผ ๋ฐ์์์ผ์ผ ํฉ๋๋ค. ์ด ์์ธ๋ ์ค๋ฅ๊ฐ ์๋๋ผ, ๋ฐ๋ณต์ด ์๋ฃ๋์์์ ๋ฃจํ ๊ตฌ๋ฌธ์ ์๋ฆฌ๋ ํ์ค ์ ํธ์ ๋๋ค.
์ดํฐ๋ ์ดํฐ์ ์ฃผ์ ํน์ง์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- ์ํ๋ฅผ ์ ์งํฉ๋๋ค: ์ดํฐ๋ ์ดํฐ๋ ์ํ์ค์์ ํ์ฌ ์์น๋ฅผ ๊ธฐ์ตํฉ๋๋ค.
- ๊ฐ์ ํ ๋ฒ์ ํ๋์ฉ ์์ฑํฉ๋๋ค: `__next__` ๋ฉ์๋๋ฅผ ํตํด.
- ์๋ชจ์ฑ์ ๋๋ค: ์ดํฐ๋ ์ดํฐ๊ฐ ์์ ํ ์๋ชจ๋๋ฉด(์ฆ, `StopIteration`์ ๋ฐ์์ํค๋ฉด) ๋น์ด ์์ต๋๋ค. ์ฌ์ค์ ํ๊ฑฐ๋ ์ฌ์ฌ์ฉํ ์ ์์ต๋๋ค. ๋ค์ ๋ฐ๋ณตํ๋ ค๋ฉด ์๋ ์ดํฐ๋ฌ๋ธ๋ก ๋์๊ฐ `iter()`๋ฅผ ๋ค์ ํธ์ถํ์ฌ ์๋ก์ด ์ดํฐ๋ ์ดํฐ๋ฅผ ์ป์ด์ผ ํฉ๋๋ค.
์ฒซ ๋ฒ์งธ ์ปค์คํ ์ดํฐ๋ ์ดํฐ ๊ตฌ์ถ: ๋จ๊ณ๋ณ ๊ฐ์ด๋
์ด๋ก ๋ ์ข์ง๋ง, ํ๋กํ ์ฝ์ ์ดํดํ๋ ๊ฐ์ฅ ์ข์ ๋ฐฉ๋ฒ์ ์ง์ ๊ตฌ์ถํ๋ ๊ฒ์ ๋๋ค. ์์ ์ซ์๋ถํฐ ์ ํ ์ซ์๊น์ง ๋ฐ๋ณตํ๋ ์นด์ดํฐ ์ญํ ์ ํ๋ ๊ฐ๋จํ ํด๋์ค๋ฅผ ๋ง๋ค์ด ๋ณด๊ฒ ์ต๋๋ค.
์์ 1: ๊ฐ๋จํ ์นด์ดํฐ ํด๋์ค
`CountUpTo`๋ผ๋ ํด๋์ค๋ฅผ ๋ง๋ค ๊ฒ์ ๋๋ค. ์ด ํด๋์ค์ ์ธ์คํด์ค๋ฅผ ๋ง๋ค ๋ ์ต๋ ์ซ์๋ฅผ ์ง์ ํ๊ณ , ๋ฐ๋ณตํ ๋ 1๋ถํฐ ํด๋น ์ต๋ ์ซ์๊น์ง์ ์ซ์๋ฅผ ์์ฑํฉ๋๋ค.
์ฝ๋:
class CountUpTo:
"""An iterator that counts from 1 up to a specified maximum number."""
def __init__(self, max_num):
print("Initializing the CountUpTo object...")
self.max_num = max_num
self.current = 0 # This will store the state
def __iter__(self):
print("__iter__ called, returning self...")
# This object is its own iterator, so we return self
return self
def __next__(self):
print("__next__ called...")
if self.current < self.max_num:
self.current += 1
return self.current
else:
# This is the crucial part: signal that we are done.
print("Raising StopIteration.")
raise StopIteration
# How to use it
print("Creating the counter object...")
counter = CountUpTo(3)
print("\nStarting the for loop...")
for number in counter:
print(f"For loop received: {number}")
์ฝ๋ ๋ถ์ ๋ฐ ์ค๋ช
`for` ๋ฃจํ๊ฐ ์คํ๋ ๋ ์ด๋ค ์ผ์ด ๋ฐ์ํ๋์ง ๋ถ์ํด ๋ด ์๋ค:
- ์ด๊ธฐํ: `counter = CountUpTo(3)`๋ ์ฐ๋ฆฌ ํด๋์ค์ ์ธ์คํด์ค๋ฅผ ์์ฑํฉ๋๋ค. `__init__` ๋ฉ์๋๊ฐ ์คํ๋์ด `self.max_num`์ 3์ผ๋ก, `self.current`๋ฅผ 0์ผ๋ก ์ค์ ํฉ๋๋ค. ์ด์ ๊ฐ์ฒด์ ์ํ๊ฐ ์ด๊ธฐํ๋์์ต๋๋ค.
- ๋ฃจํ ์์: `for number in counter:` ๋ผ์ธ์ ๋๋ฌํ๋ฉด ํ์ด์ฌ์ ๋ด๋ถ์ ์ผ๋ก `iter(counter)`๋ฅผ ํธ์ถํฉ๋๋ค.
- `__iter__` ํธ์ถ: `iter(counter)` ํธ์ถ์ `counter.__iter__()` ๋ฉ์๋๋ฅผ ํธ์ถํฉ๋๋ค. ์ฝ๋์์ ๋ณผ ์ ์๋ฏ์ด ์ด ๋ฉ์๋๋ ๋จ์ํ ๋ฉ์์ง๋ฅผ ์ถ๋ ฅํ๊ณ `self`๋ฅผ ๋ฐํํฉ๋๋ค. ์ด๋ `for` ๋ฃจํ์๊ฒ "`__next__`๋ฅผ ํธ์ถํด์ผ ํ ๊ฐ์ฒด๋ ๋๋ค!"๋ผ๊ณ ์๋ ค์ค๋๋ค.
- ๋ฃจํ ์์: ์ด์ `for` ๋ฃจํ๊ฐ ์ค๋น๋์์ต๋๋ค. ๊ฐ ๋ฐ๋ณต์์ `for` ๋ฃจํ๋ ๋ฐ์ ์ดํฐ๋ ์ดํฐ ๊ฐ์ฒด(์ฌ๊ธฐ์๋ `counter` ๊ฐ์ฒด)์ ๋ํด `next()`๋ฅผ ํธ์ถํฉ๋๋ค.
- ์ฒซ ๋ฒ์งธ `__next__` ํธ์ถ: `counter.__next__()` ๋ฉ์๋๊ฐ ํธ์ถ๋ฉ๋๋ค. `self.current`๋ 0์ด๋ฉฐ, ์ด๋ `self.max_num`(3)๋ณด๋ค ์์ต๋๋ค. ์ฝ๋๋ `self.current`๋ฅผ 1๋ก ์ฆ๊ฐ์ํค๊ณ ์ด๋ฅผ ๋ฐํํฉ๋๋ค. `for` ๋ฃจํ๋ ์ด ๊ฐ์ `number` ๋ณ์์ ํ ๋นํ๊ณ ๋ฃจํ ๋ณธ๋ฌธ(`print(...)`)์ด ์คํ๋ฉ๋๋ค.
- ๋ ๋ฒ์งธ `__next__` ํธ์ถ: ๋ฃจํ๊ฐ ๊ณ์๋ฉ๋๋ค. `__next__`๊ฐ ๋ค์ ํธ์ถ๋ฉ๋๋ค. `self.current`๋ 1์ ๋๋ค. 2๋ก ์ฆ๊ฐ๋๊ณ ๋ฐํ๋ฉ๋๋ค.
- ์ธ ๋ฒ์งธ `__next__` ํธ์ถ: `__next__`๊ฐ ๋ค์ ํธ์ถ๋ฉ๋๋ค. `self.current`๋ 2์ ๋๋ค. 3์ผ๋ก ์ฆ๊ฐ๋๊ณ ๋ฐํ๋ฉ๋๋ค.
- ๋ง์ง๋ง `__next__` ํธ์ถ: `__next__`๊ฐ ํ ๋ฒ ๋ ํธ์ถ๋ฉ๋๋ค. ์ด์ `self.current`๋ 3์ ๋๋ค. `self.current < self.max_num` ์กฐ๊ฑด์ด ๊ฑฐ์ง์ ๋๋ค. `else` ๋ธ๋ก์ด ์คํ๋๊ณ `StopIteration`์ด ๋ฐ์ํฉ๋๋ค.
- ๋ฃจํ ์ข ๋ฃ: `for` ๋ฃจํ๋ `StopIteration` ์์ธ๋ฅผ ์ก๋๋ก ์ค๊ณ๋์์ต๋๋ค. ์ด ์์ธ๋ฅผ ์ก์ผ๋ฉด ๋ฐ๋ณต์ด ์๋ฃ๋์์์ ์๊ณ ์ ์์ ์ผ๋ก ์ข ๋ฃ๋ฉ๋๋ค. ํ๋ก๊ทธ๋จ์ ๋ฃจํ ์ดํ์ ์ฝ๋๋ฅผ ๊ณ์ ์คํํฉ๋๋ค.
ํต์ฌ์ ์ธ ์ธ๋ถ ์ฌํญ์ ์ฃผ๋ชฉํ์ธ์: ๋์ผํ `counter` ๊ฐ์ฒด์์ `for` ๋ฃจํ๋ฅผ ๋ค์ ์คํํ๋ ค๊ณ ํ๋ฉด ์๋ํ์ง ์์ต๋๋ค. ์ดํฐ๋ ์ดํฐ๊ฐ ์๋ชจ๋์๊ธฐ ๋๋ฌธ์ ๋๋ค. `self.current`๋ ์ด๋ฏธ 3์ด๋ฏ๋ก, ์ดํ์ `__next__` ํธ์ถ์ ์ฆ์ `StopIteration`์ ๋ฐ์์ํฌ ๊ฒ์ ๋๋ค. ์ด๊ฒ์ ์ฐ๋ฆฌ ๊ฐ์ฒด๊ฐ ๊ทธ ์์ฒด๋ก ์ดํฐ๋ ์ดํฐ์ธ ๊ฒฐ๊ณผ์ ๋๋ค.
๊ณ ๊ธ ์ดํฐ๋ ์ดํฐ ๊ฐ๋ ๋ฐ ์ค์ ์ ์ฉ
๊ฐ๋จํ ์นด์ดํฐ๋ ๋ฐฐ์ฐ๊ธฐ ์ข์ ๋ฐฉ๋ฒ์ด์ง๋ง, ์ดํฐ๋ ์ดํฐ ํ๋กํ ์ฝ์ ์ง์ ํ ํ์ ๋ ๋ณต์กํ ์ฌ์ฉ์ ์ ์ ๋ฐ์ดํฐ ๊ตฌ์กฐ์ ์ ์ฉ๋ ๋ ๋น์ ๋ฐํฉ๋๋ค.
์ดํฐ๋ฌ๋ธ๊ณผ ์ดํฐ๋ ์ดํฐ ๊ฒฐํฉ์ ๋ฌธ์ ์
`CountUpTo` ์์์์ ํด๋์ค๋ ์ดํฐ๋ฌ๋ธ์ด์ ์ดํฐ๋ ์ดํฐ์์ต๋๋ค. ์ด๊ฒ์ ๊ฐ๋จํ์ง๋ง, ์ฃผ์ ๋จ์ ์ด ์์ต๋๋ค: ๊ฒฐ๊ณผ ์ดํฐ๋ ์ดํฐ๋ ์๋ชจ์ฑ์ ๋๋ค. ์ผ๋จ ํ ๋ฒ ๋ฐ๋ณตํ๋ฉด ๋๋ฉ๋๋ค.
์ฝ๋:
counter = CountUpTo(2)
print("First iteration:")
for num in counter: print(num) # Works fine
print("\nSecond iteration:")
for num in counter: print(num) # Prints nothing!
์ด๊ฒ์ ์ํ(`self.current`)๊ฐ ๊ฐ์ฒด ์์ฒด์ ์ ์ฅ๋๊ธฐ ๋๋ฌธ์ ๋ฐ์ํฉ๋๋ค. ์ฒซ ๋ฒ์งธ ๋ฃจํ ์ดํ `self.current`๋ 2์ด๋ฉฐ, ์ถ๊ฐ `__next__` ํธ์ถ์ `StopIteration`๋ง ๋ฐ์์ํฌ ๊ฒ์ ๋๋ค. ์ด ๋์์ ์ฌ๋ฌ ๋ฒ ๋ฐ๋ณตํ ์ ์๋ ํ์ค ํ์ด์ฌ ๋ฆฌ์คํธ์๋ ๋ค๋ฆ ๋๋ค.
๋ ๊ฒฌ๊ณ ํ ํจํด: ์ดํฐ๋ฌ๋ธ๊ณผ ์ดํฐ๋ ์ดํฐ ๋ถ๋ฆฌํ๊ธฐ
ํ์ด์ฌ์ ๋ด์ฅ ์ปฌ๋ ์ ๊ณผ ๊ฐ์ด ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ์ดํฐ๋ฌ๋ธ์ ๋ง๋ค๋ ค๋ฉด ๋ ๊ฐ์ง ์ญํ ์ ๋ถ๋ฆฌํ๋ ๊ฒ์ด ๊ฐ์ฅ ์ข์ต๋๋ค. ์ปจํ ์ด๋ ๊ฐ์ฒด๋ ์ดํฐ๋ฌ๋ธ์ด ๋๊ณ , `__iter__` ๋ฉ์๋๊ฐ ํธ์ถ๋ ๋๋ง๋ค ์๋กญ๊ณ ์ ์ ํ ์ดํฐ๋ ์ดํฐ ๊ฐ์ฒด๋ฅผ ์์ฑํ ๊ฒ์ ๋๋ค.
์์ ๋ฅผ `Sentence` (์ดํฐ๋ฌ๋ธ)์ `SentenceIterator` (์ดํฐ๋ ์ดํฐ) ๋ ํด๋์ค๋ก ๋ฆฌํฉํ ๋งํด ๋ด ์๋ค.
์ฝ๋:
class SentenceIterator:
"""The iterator responsible for state and producing values."""
def __init__(self, words):
self.words = words
self.index = 0
def __next__(self):
try:
word = self.words[self.index]
except IndexError:
raise StopIteration()
self.index += 1
return word
def __iter__(self):
# An iterator must also be an iterable, returning itself.
return self
class Sentence:
"""The iterable container class."""
def __init__(self, text):
# The container holds the data.
self.words = text.split()
def __iter__(self):
# Each time __iter__ is called, it creates a NEW iterator object.
return SentenceIterator(self.words)
# How to use it
my_sentence = Sentence('This is a test')
print("First iteration:")
for word in my_sentence:
print(word)
print("\nSecond iteration:")
for word in my_sentence:
print(word)
์ด์ ๋ฆฌ์คํธ์ ๋๊ฐ์ด ์๋ํฉ๋๋ค! `for` ๋ฃจํ๊ฐ ์์๋ ๋๋ง๋ค `my_sentence.__iter__()`๋ฅผ ํธ์ถํ์ฌ ์์ฒด ์ํ(`self.index = 0`)๋ฅผ ๊ฐ์ง ์๋ก์ด `SentenceIterator` ์ธ์คํด์ค๋ฅผ ์์ฑํฉ๋๋ค. ์ด๋ฅผ ํตํด ๋์ผํ `Sentence` ๊ฐ์ฒด์ ๋ํด ์ฌ๋ฌ ๋ฒ ๋ ๋ฆฝ์ ์ธ ๋ฐ๋ณต์ด ๊ฐ๋ฅํฉ๋๋ค. ์ด ํจํด์ ํจ์ฌ ๋ ๊ฒฌ๊ณ ํ๋ฉฐ ํ์ด์ฌ ์์ฒด์ ์ปฌ๋ ์ ์ด ๊ตฌํ๋๋ ๋ฐฉ์์ ๋๋ค.
์์: ๋ฌดํ ์ดํฐ๋ ์ดํฐ
์ดํฐ๋ ์ดํฐ๊ฐ ์ ํํ ํ์๋ ์์ต๋๋ค. ๋ฌดํํ ๋ฐ์ดํฐ ์ํ์ค๋ฅผ ๋ํ๋ผ ์ ์์ต๋๋ค. ์ด๊ฒ์ด ๋ฐ๋ก ์ดํฐ๋ ์ดํฐ์ ์ง์ฐ์ ์ด๊ณ ํ ๋ฒ์ ํ๋์ฉ ์ฒ๋ฆฌํ๋ ํน์ฑ์ด ํฐ ์ฅ์ ์ด ๋๋ ์ง์ ์ ๋๋ค. ๋ฌดํ ํผ๋ณด๋์น ์์ด์ ์ํ ์ดํฐ๋ ์ดํฐ๋ฅผ ๋ง๋ค์ด ๋ด ์๋ค.
์ฝ๋:
class FibonacciIterator:
"""Generates an infinite sequence of Fibonacci numbers."""
def __init__(self):
self.a, self.b = 0, 1
def __iter__(self):
return self
def __next__(self):
result = self.a
self.a, self.b = self.b, self.a + self.b
return result
# How to use it - CAUTION: Infinite loop without a break!
fib_gen = FibonacciIterator()
for i, num in enumerate(fib_gen):
print(f"Fibonacci({i}): {num}")
if i >= 10: # We must provide a stopping condition
break
์ด ์ดํฐ๋ ์ดํฐ๋ ์ค์ค๋ก `StopIteration`์ ๋ฐ์์ํค์ง ์์ต๋๋ค. ๋ฃจํ๋ฅผ ์ข ๋ฃํ ์กฐ๊ฑด(`break` ๋ฌธ๊ณผ ๊ฐ์)์ ์ ๊ณตํ๋ ๊ฒ์ ํธ์ถ ์ฝ๋์ ์ฑ ์์ ๋๋ค. ์ด ํจํด์ ๋ฐ์ดํฐ ์คํธ๋ฆฌ๋ฐ, ์ด๋ฒคํธ ๋ฃจํ, ์์น ์๋ฎฌ๋ ์ด์ ์์ ํํ ์ฌ์ฉ๋ฉ๋๋ค.
ํ์ด์ฌ ์ํ๊ณ์ ์ดํฐ๋ ์ดํฐ ํ๋กํ ์ฝ
`__iter__`์ `__next__`๋ฅผ ์ดํดํ๋ฉด ํ์ด์ฌ ๊ณณ๊ณณ์์ ๊ทธ ์ํฅ๋ ฅ์ ๋ณผ ์ ์์ต๋๋ค. ์ด๋ ํ์ด์ฌ์ ์๋ง์ ๊ธฐ๋ฅ์ด ์๋ก ์ํํ๊ฒ ์๋ํ๋๋ก ํ๋ ํตํฉ ํ๋กํ ์ฝ์ ๋๋ค.
`for` ๋ฃจํ๊ฐ *์ค์ ๋ก* ์๋ํ๋ ๋ฐฉ์
์๋ฌต์ ์ผ๋ก ๋ ผ์ํ์ง๋ง, ๋ช ์์ ์ผ๋ก ์ค๋ช ํด ๋ด ์๋ค. ํ์ด์ฌ์ด ๋ค์ ์ค์ ๋ง๋๋ฉด:
`for item in my_iterable:`
๋ฐฐํ์์ ๋ค์ ๋จ๊ณ๋ฅผ ์ํํฉ๋๋ค:
- ์ดํฐ๋ ์ดํฐ๋ฅผ ์ป๊ธฐ ์ํด `iter(my_iterable)`๋ฅผ ํธ์ถํฉ๋๋ค. ์ด๋ ์ฐจ๋ก๋ก `my_iterable.__iter__()`๋ฅผ ํธ์ถํฉ๋๋ค. ๋ฐํ๋ ๊ฐ์ฒด๋ฅผ `iterator_obj`๋ผ๊ณ ํฉ์๋ค.
- ๋ฌดํ `while True` ๋ฃจํ์ ์ง์ ํฉ๋๋ค.
- ๋ฃจํ ๋ด๋ถ์์ `next(iterator_obj)`๋ฅผ ํธ์ถํ๊ณ , ์ด๋ ์ฐจ๋ก๋ก `iterator_obj.__next__()`๋ฅผ ํธ์ถํฉ๋๋ค.
- `__next__`๊ฐ ๊ฐ์ ๋ฐํํ๋ฉด, ์ด ๊ฐ์ `item` ๋ณ์์ ํ ๋น๋๊ณ , `for` ๋ฃจํ ๋ธ๋ก ๋ด๋ถ์ ์ฝ๋๊ฐ ์คํ๋ฉ๋๋ค.
- `__next__`๊ฐ `StopIteration` ์์ธ๋ฅผ ๋ฐ์์ํค๋ฉด, `for` ๋ฃจํ๋ ์ด ์์ธ๋ฅผ ์ก๊ณ ๋ด๋ถ `while` ๋ฃจํ์์ ๋ฒ์ด๋ฉ๋๋ค. ๋ฐ๋ณต์ด ์๋ฃ๋ฉ๋๋ค.
์ปดํ๋ฆฌํจ์ ๋ฐ ์ ๋๋ ์ดํฐ ํํ์
๋ฆฌ์คํธ, ์ , ๋์ ๋๋ฆฌ ์ปดํ๋ฆฌํจ์ ์ ๋ชจ๋ ์ดํฐ๋ ์ดํฐ ํ๋กํ ์ฝ์ ์ํด ๊ตฌ๋๋ฉ๋๋ค. ๋ค์๊ณผ ๊ฐ์ด ์์ฑํ ๋:
`squares = [x * x for x in range(10)]`
ํ์ด์ฌ์ ํจ๊ณผ์ ์ผ๋ก `range(10)` ๊ฐ์ฒด๋ฅผ ๋ฐ๋ณตํ์ฌ ๊ฐ ๊ฐ์ ์ป๊ณ , `x * x` ํํ์์ ์คํํ์ฌ ๋ฆฌ์คํธ๋ฅผ ๊ตฌ์ถํฉ๋๋ค. ์ ๋๋ ์ดํฐ ํํ์์๋ ๋์ผํ๊ฒ ์ ์ฉ๋๋ฉฐ, ์ด๋ ์ง์ฐ ๋ฐ๋ณต์ ๋์ฑ ์ง์ ์ ์ผ๋ก ์ฌ์ฉํฉ๋๋ค:
`lazy_squares = (x * x for x in range(1000000))`
์ด๊ฒ์ ๋ฉ๋ชจ๋ฆฌ์ ๋ฐฑ๋ง ๊ฐ์ ํญ๋ชฉ์ผ๋ก ๊ตฌ์ฑ๋ ๋ฆฌ์คํธ๋ฅผ ์์ฑํ์ง ์์ต๋๋ค. ์ดํฐ๋ ์ดํฐ(ํนํ ์ ๋๋ ์ดํฐ ๊ฐ์ฒด)๋ฅผ ์์ฑํ์ฌ ๋ฐ๋ณตํ ๋๋ง๋ค ํ๋์ฉ ์ ๊ณฑ ๊ฐ์ ๊ณ์ฐํฉ๋๋ค.
์ ๋๋ ์ดํฐ: ์ดํฐ๋ ์ดํฐ๋ฅผ ๋ง๋๋ ๋ ๊ฐ๋จํ ๋ฐฉ๋ฒ
`__iter__`์ `__next__`๋ฅผ ๊ฐ์ง ์ ์ฒด ํด๋์ค๋ฅผ ๋ง๋๋ ๊ฒ์ด ์ต๋์ ์ ์ด๊ถ์ ์ ๊ณตํ์ง๋ง, ๊ฐ๋จํ ๊ฒฝ์ฐ์๋ ์ฅํฉํ ์ ์์ต๋๋ค. ํ์ด์ฌ์ ์ดํฐ๋ ์ดํฐ๋ฅผ ๋ง๋๋ ํจ์ฌ ๋ ๊ฐ๊ฒฐํ ๊ตฌ๋ฌธ์ธ ์ ๋๋ ์ดํฐ๋ฅผ ์ ๊ณตํฉ๋๋ค.
์ ๋๋ ์ดํฐ๋ `yield` ํค์๋๋ฅผ ์ฌ์ฉํ๋ ํจ์์ ๋๋ค. ์ ๋๋ ์ดํฐ ํจ์๋ฅผ ํธ์ถํ๋ฉด ์ฝ๋๊ฐ ์คํ๋์ง ์์ต๋๋ค. ๋์ , ์์ ํ ์ดํฐ๋ ์ดํฐ์ธ ์ ๋๋ ์ดํฐ ๊ฐ์ฒด๋ฅผ ๋ฐํํฉ๋๋ค.
`CountUpTo` ์์ ๋ฅผ ์ ๋๋ ์ดํฐ๋ก ๋ค์ ์์ฑํด ๋ด ์๋ค:
์ฝ๋:
def count_up_to_generator(max_num):
"""A generator function that yields numbers from 1 to max_num."""
print("Generator started...")
current = 1
while current <= max_num:
yield current # Pauses here and sends a value back
current += 1
print("Generator finished.")
# How to use it
counter_gen = count_up_to_generator(3)
for number in counter_gen:
print(f"For loop received: {number}")
์ผ๋ง๋ ๊ฐ๋จํ์ง ๋ณด์ธ์! `yield` ํค์๋๊ฐ ์ฌ๊ธฐ์ ๋ง๋ฒ์ ๋๋ค. `yield`๋ฅผ ๋ง๋๋ฉด ํจ์์ ์ํ๊ฐ ๊ณ ์ ๋๊ณ , ๊ฐ์ด ํธ์ถ์์๊ฒ ์ ๋ฌ๋๋ฉฐ, ํจ์๊ฐ ์ผ์ ์ค์ง๋ฉ๋๋ค. ์ ๋๋ ์ดํฐ ๊ฐ์ฒด์์ `__next__`๊ฐ ๋ค์์ผ๋ก ํธ์ถ๋ ๋, ํจ์๋ ๋ค๋ฅธ `yield`๋ฅผ ๋ง๋๊ฑฐ๋ ํจ์๊ฐ ๋๋ ๋๊น์ง ์ค๋จ๋ ์ง์ ๋ถํฐ ์คํ์ ์ฌ๊ฐํฉ๋๋ค. ํจ์๊ฐ ๋๋๋ฉด `StopIteration`์ด ์๋์ผ๋ก ๋ฐ์ํฉ๋๋ค.
๋ด๋ถ์ ์ผ๋ก ํ์ด์ฌ์ `__iter__`์ `__next__` ๋ฉ์๋๋ฅผ ๊ฐ์ง ๊ฐ์ฒด๋ฅผ ์๋์ผ๋ก ์์ฑํ์ต๋๋ค. ์ ๋๋ ์ดํฐ๊ฐ ์ข ์ข ๋ ์ค์ฉ์ ์ธ ์ ํ์ด์ง๋ง, ๋๋ฒ๊น , ๋ณต์กํ ์์คํ ์ค๊ณ, ํ์ด์ฌ ํต์ฌ ๋ฉ์ปค๋์ฆ์ด ์ด๋ป๊ฒ ์๋ํ๋์ง ์ดํดํ๊ธฐ ์ํด์๋ ๊ธฐ๋ณธ ํ๋กํ ์ฝ์ ์ดํดํ๋ ๊ฒ์ด ํ์์ ์ ๋๋ค.
๋ชจ๋ฒ ์ฌ๋ก ๋ฐ ์ผ๋ฐ์ ์ธ ํจ์
์ดํฐ๋ ์ดํฐ ํ๋กํ ์ฝ์ ๊ตฌํํ ๋, ์ผ๋ฐ์ ์ธ ์ค๋ฅ๋ฅผ ํผํ๊ธฐ ์ํด ๋ค์ ์ง์นจ์ ์ผ๋์ ๋์ญ์์ค.
๋ชจ๋ฒ ์ฌ๋ก
- ์ดํฐ๋ฌ๋ธ๊ณผ ์ดํฐ๋ ์ดํฐ ๋ถ๋ฆฌ: ์ฌ๋ฌ ๋ฒ ์ํํด์ผ ํ๋ ๋ชจ๋ ์ปจํ ์ด๋ ๊ฐ์ฒด์ ๊ฒฝ์ฐ, ํญ์ ์ดํฐ๋ ์ดํฐ๋ฅผ ๋ณ๋์ ํด๋์ค๋ก ๊ตฌํํ์ญ์์ค. ์ปจํ ์ด๋์ `__iter__` ๋ฉ์๋๋ ๋งค๋ฒ ์ดํฐ๋ ์ดํฐ ํด๋์ค์ ์ ์ธ์คํด์ค๋ฅผ ๋ฐํํด์ผ ํฉ๋๋ค.
- ํญ์ `StopIteration` ๋ฐ์: `__next__` ๋ฉ์๋๋ ์ข ๋ฃ๋ฅผ ์๋ฆฌ๊ธฐ ์ํด `StopIteration`์ ์์ ์ ์ผ๋ก ๋ฐ์์์ผ์ผ ํฉ๋๋ค. ์ด๋ฅผ ์์ผ๋ฉด ๋ฌดํ ๋ฃจํ๊ฐ ๋ฐ์ํฉ๋๋ค.
- ์ดํฐ๋ ์ดํฐ๋ ์ดํฐ๋ฌ๋ธ์ด์ด์ผ ํจ: ์ดํฐ๋ ์ดํฐ์ `__iter__` ๋ฉ์๋๋ ํญ์ `self`๋ฅผ ๋ฐํํด์ผ ํฉ๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ์ดํฐ๋ ์ดํฐ๊ฐ ์ดํฐ๋ฌ๋ธ์ด ์์๋๋ ๋ชจ๋ ๊ณณ์์ ์ฌ์ฉ๋ ์ ์์ต๋๋ค.
- ๊ฐ๋จํ ๊ฒฝ์ฐ ์ ๋๋ ์ดํฐ ์ ํธ: ์ดํฐ๋ ์ดํฐ ๋ก์ง์ด ๊ฐ๋จํ๊ณ ๋จ์ผ ํจ์๋ก ํํ๋ ์ ์๋ค๋ฉด, ์ ๋๋ ์ดํฐ๊ฐ ๊ฑฐ์ ํญ์ ๋ ๊น๋ํ๊ณ ์ฝ๊ธฐ ์ฝ์ต๋๋ค. ์ดํฐ๋ ์ดํฐ ๊ฐ์ฒด ์์ฒด์ ๋ ๋ณต์กํ ์ํ๋ ๋ฉ์๋๋ฅผ ์ฐ๊ฒฐํด์ผ ํ ๋๋ ์์ ํ ์ดํฐ๋ ์ดํฐ ํด๋์ค๋ฅผ ์ฌ์ฉํ์ญ์์ค.
์ผ๋ฐ์ ์ธ ํจ์
- ์๋ชจ์ฑ ์ดํฐ๋ ์ดํฐ ๋ฌธ์ : ๋ ผ์ํ๋ฏ์ด, ๊ฐ์ฒด๊ฐ ๊ทธ ์์ฒด๋ก ์ดํฐ๋ ์ดํฐ์ผ ๊ฒฝ์ฐ ํ ๋ฒ๋ง ์ฌ์ฉ๋ ์ ์์์ ์ ์ํ์ญ์์ค. ์ฌ๋ฌ ๋ฒ ๋ฐ๋ณตํด์ผ ํ๋ ๊ฒฝ์ฐ, ์ ์ธ์คํด์ค๋ฅผ ๋ง๋ค๊ฑฐ๋ ๋ถ๋ฆฌ๋ ์ดํฐ๋ฌ๋ธ/์ดํฐ๋ ์ดํฐ ํจํด์ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
- ์ํ ๋ง๊ฐ: `__next__` ๋ฉ์๋๋ ์ดํฐ๋ ์ดํฐ์ ๋ด๋ถ ์ํ(์: ์ธ๋ฑ์ค ์ฆ๊ฐ ๋๋ ํฌ์ธํฐ ์ด๋)๋ฅผ ์์ ํด์ผ ํฉ๋๋ค. ์ํ๊ฐ ์ ๋ฐ์ดํธ๋์ง ์์ผ๋ฉด `__next__`๋ ๊ณ์ํด์ ๋์ผํ ๊ฐ์ ๋ฐํํ์ฌ ๋ฌดํ ๋ฃจํ๋ฅผ ์ ๋ฐํ ๊ฐ๋ฅ์ฑ์ด ๋์ต๋๋ค.
- ๋ฐ๋ณต ์ค ์ปฌ๋ ์ ์์ : ์ปฌ๋ ์ ์ ๋ฐ๋ณตํ๋ ๋์ ์ปฌ๋ ์ ์ ์์ ํ๋ฉด(์: `for` ๋ฃจํ ๋ด๋ถ์์ ๋ฆฌ์คํธ์ ํญ๋ชฉ์ ์ ๊ฑฐํ๋ ๊ฒฝ์ฐ) ํญ๋ชฉ ๊ฑด๋๋ฐ๊ธฐ ๋๋ ์์์น ๋ชปํ ์ค๋ฅ ๋ฐ์๊ณผ ๊ฐ์ ์์ธก ๋ถ๊ฐ๋ฅํ ๋์์ ์ด๋ํ ์ ์์ต๋๋ค. ์๋ณธ์ ์์ ํด์ผ ํ๋ ๊ฒฝ์ฐ ์ปฌ๋ ์ ์ ๋ณต์ฌ๋ณธ์ ๋ฐ๋ณตํ๋ ๊ฒ์ด ์ผ๋ฐ์ ์ผ๋ก ๋ ์์ ํฉ๋๋ค.
๊ฒฐ๋ก
๊ฐ๋จํ `__iter__`์ `__next__` ๋ฉ์๋๋ก ๊ตฌ์ฑ๋ ์ดํฐ๋ ์ดํฐ ํ๋กํ ์ฝ์ ํ์ด์ฌ ๋ฐ๋ณต์ ๊ทผ๊ฐ์ ๋๋ค. ์ด๋ ๊ฐ๋ ฅํ๊ณ ๋ณต์กํ ๋์์ ๊ฐ๋ฅํ๊ฒ ํ๋ ๊ฐ๋จํ๊ณ ์ผ๊ด๋ ์ธํฐํ์ด์ค๋ฅผ ์ ํธํ๋ ํ์ด์ฌ์ ์ค๊ณ ์ฒ ํ์ ์ ์ฆํ๋ ๊ฒ์ ๋๋ค. ์์ฐจ์ ๋ฐ์ดํฐ ์ ๊ทผ์ ์ํ ๋ณดํธ์ ์ธ ๊ณ์ฝ์ ์ ๊ณตํจ์ผ๋ก์จ, ์ด ํ๋กํ ์ฝ์ `for` ๋ฃจํ, ์ปดํ๋ฆฌํจ์ ๋ฐ ์๋ง์ ๋ค๋ฅธ ๋๊ตฌ๋ค์ด ๊ทธ ์ธ์ด๋ฅผ ๋งํ๋ ๋ชจ๋ ๊ฐ์ฒด์ ์ํํ๊ฒ ์๋ํ๋๋ก ํฉ๋๋ค.
์ด ํ๋กํ ์ฝ์ ๋ง์คํฐํจ์ผ๋ก์จ, ํ์ด์ฌ ์ํ๊ณ์์ ์ผ๋ฑ ์๋ฏผ์ธ ์์ ๋ง์ ์ํ์ค ์ ์ฌ ๊ฐ์ฒด๋ฅผ ๋ง๋ค ์ ์๋ ๋ฅ๋ ฅ์ ์ป์์ต๋๋ค. ์ด์ ๋ฐ์ดํฐ๋ฅผ ์ง์ฐ ์ฒ๋ฆฌํ์ฌ ๋ฉ๋ชจ๋ฆฌ ํจ์จ์ ๋์ด๊ณ , ํ์ค ํ์ด์ฌ ๊ตฌ๋ฌธ๊ณผ ๊น๋ํ๊ฒ ํตํฉํ์ฌ ๋ ์ง๊ด์ ์ด๋ฉฐ, ๊ถ๊ทน์ ์ผ๋ก ๋ ๊ฐ๋ ฅํ ํด๋์ค๋ฅผ ์์ฑํ ์ ์์ต๋๋ค. ๋ค์์ `for` ๋ฃจํ๋ฅผ ์์ฑํ ๋, ํ๋ฉด ์๋์์ ์ผ์ด๋๋ `__iter__`์ `__next__`์ ์ฐ์ํ ์ถค์ ์ ์ ๊ฐ์ํด ๋ณด์ธ์.